package com.idroc.storage;

/**
 * IO分页ID工具类
 * pageId组成[pageType|fileId|blockIndex|8bit], 只使用long的高56位bit
 * @author yuyoo (yuyoo4j@163.com)
 * @date 2010-3-27 下午04:04:44
 */
public final class IoPageIdUtil {
	
	/**
	 * 空IO分页ID
	 */
	public static final long NULL_PAGE_ID = 0L;
		
	/**
	 * 获取pageId包含的IO分页类型
	 * pageId的第1字节的8bit
	 * @param pageId -- IO分页ID
	 * @return -- IO分页类型
	 */
	public static short getPageType(long pageId) {
		
		short pt = (short)(pageId >>> 56);
		return (short)(0x00ff & pt);
	}
	
	/**
	 * 获取pageId包含的所在文件ID
	 * pageId的第2字节的8bit
	 * @param pageId -- IO分页ID
	 * @return -- 文件ID
	 */
	public static short getFileId(long pageId) {
		
		short fileId = (short)(pageId >>> 48);
		return (short)(0x00ff & fileId);
	}
	
	/**
	 * 获取pageId包含的数据所在文件的IO块的编号
	 * pageId的3-7字节的40bit
	 * @param pageId -- IO分页ID
	 * @return -- IO块的编号
	 */
	public static long getIoBlockIndex(long pageId) {
		
		long p = (long)(pageId >>> 8);
		return p & 0xffffffffffL;
	}
	
	/**
	 * 组装合成IO分页ID
	 * @param magicNumber -- 魔法数字
	 * @param pageType -- IO分页类型
	 * @param fileId -- IO块文件ID
	 * @param blockIndex -- IO块的编号
	 * @return -- IO分页ID
	 */
	public static long toPageId(short pageType, short fileId, long blockIndex) {
		
		long rtv = 0l; 
		rtv += ((long)pageType) << 56;
		rtv += ((long)fileId) << 48;
		rtv += blockIndex << 8;
		return rtv;
	}
}
